package main

import (
	"fmt"
)

/*
知识点1：数组
特点：内存连续的数据集合   var
     数组取值下标从0开始
     作为函数参数（值传递  引用传递）
 知识点 切片
     切片底层是数组
     动态增加的 数组是固定的
     函数参数属于引用传递
*/

var arr_name [2]int

var slice_name []int

/*
	j :=func(i,j int){
		data=i+j
		return data
	}
	//j是我们函数的地址
	x,y :=func(i,j int)(m,n int){
		return j,i
	}(1,8)
*/

//闭包
func f(i int) func() int {
	return func() int {
		i++
		return i
	}
}

func main() {
	fmt.Println("wujiangpan")
	arr_name[0] = 1
	arr_name[1] = 10
	//Arr_func(arr_name)
	Arr_func(&arr_name)
	fmt.Println(arr_name)

	fmt.Println("切片开始")

	//slice_name = make([]int, 10)
	slice_name = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	slice_name = append(slice_name, 100)
	fmt.Println("arr_name", slice_name)
	fmt.Println("取值")
	newname := slice_name[1]
	fmt.Println("newname", newname)
	newname1 := slice_name[1:3]
	fmt.Println("newname", newname1)
	newname3 := slice_name[1:3:9] //容量 slice_name[n:m:f] 长度m-n  cap f-n
	fmt.Println("newname", newname3)

	fmt.Println("函数执行顺序", "var,init,main")

	fmt.Println("结构体参数函数")
	fmt.Println("匿名函数1")

	x, y := func(i, j int) (m, n int) {
		fmt.Println("i:", i, "j:", j)
		return j, i
	}(1, 8)
	fmt.Println("x:", x, "y:", y)

	j := func(i, j int) (data int) {
		data = i + j
		return data
	}
	fmt.Println("匿名函数2", j(2, 3))
	fmt.Println("匿名函数3")
	//并发
	//go func(){
	//收发数据
	//}

	fmt.Println("闭包确保数据安全")
	data := f(1)
	fmt.Println("data:", data)
	fmt.Println("data:", data())

}

//值传递
//引用传递
func Arr_func(arr_name *[2]int) {
	//func Arr_func(arr_name *[2]int) {
	arr_name[1] = 100
	fmt.Println(arr_name)
}
